package dao;

import java.util.List;

import hbt.HibernateUtil;

import negocio.ItemRemito;
import negocio.Remito;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
public class RemitoDAO 
{

	private static RemitoDAO  instancia;
	private static SessionFactory sf;
	
	public static RemitoDAO getinstancia()
	{
		if(instancia==null)
		{
			sf=HibernateUtil.getSessionFactory();
			instancia=new RemitoDAO();
		}
		return instancia;
	}
	
	public void PersistRemito (Remito re)
	{
		Session s=sf.openSession();
		int id = this.maximoid();
		int numeroOrden=(int) s.createQuery("select o.id_orden_de_compra from OrdenCompra o where o.numeroOrden =:valor").setParameter("valor", re.getOrdenCompra().getNumeroOrden()).uniqueResult();
		s.createSQLQuery("insert into remitos values (:id , :numero)").setParameter("id",id).setParameter("numero", numeroOrden).executeUpdate();
		for(ItemRemito i : re.getItems())
			this.PersistItemRemito(i , id);
		
		s.flush();
	}
	
	
	public void PersistItemRemito (ItemRemito item , int idRemito)
	{
		Session s= sf.openSession();
		s.beginTransaction();
		
		int idItemRemito=this.maximoidItemRemito() ;
		float cantidad= item.getCantidad();
		int idProducto = item.getProducto().getId_producto();
		s.createSQLQuery("insert into items_remito values (:id_item_remito , :cantidad , :id_producto , :idremito )").
		setParameter("id_item_remito", idItemRemito ).
		setParameter("cantidad",cantidad).
		setParameter("id_producto", idProducto).
		setParameter("idremito", idRemito).executeUpdate();
		s.flush();
		s.getTransaction().commit();
	}
	
	
	public int maximoid()
	{
		Session s = sf.openSession();
		int i=0;
		Object o = s.createQuery("select max(r.id_remito) from Remito r").uniqueResult();
		if(o==null)
			i=1;
		else
			i=(int) o +1;
		return i;
	}
	
	public int maximoidItemRemito()
	{
		Session s = sf.openSession();
		int i=0;
		Object o = s.createQuery("select max(r.id_item_remito) from ItemRemito r").uniqueResult();
		if(o==null)
			i=1;
		else
			i=(int)o +1;
		return i;
	}


	@SuppressWarnings("unchecked")
	public void controlarRemitoExcedentes() 
	{
		Session s = sf.openSession();
		List<Object[]>lista=s.createSQLQuery("select ir.id_producto " +
												"from item_compra ic join items_remito ir " +
												"	on (ic.id_producto = ir.id_producto)" +
												"	 where ic.cantidad - ir.cantidad =0").list();
		for(Object [] o : lista)
		{
		}
	}


	public void controlarRemito() 
	{
		// TODO Auto-generated method stub
	}
}
